题目大意
给定一个正整数 N,求它在杨辉三角按“从上到下、从左到右”展开后的序列中,第一次出现的位置。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思考方向
你原来的代码在做的是“一个下降乘积取模”:
这和题目没有关系。
这题真正要做的是:
* 杨辉三角中的数是组合数 C(n,m)
* 需要找最早出现的那个 C(n,m)=N
* 根据位置公式输出答案
根据你给的解析:
* 只需要检查较小列数 i 在 0~16 的范围内
* 对每个 i,二分查找是否存在 C(mid,i)=N
* 找到后输出位置
mid(mid+1)2+i+1\frac{mid(mid+1)}{2}+i+1 2mid(mid+1) +i+1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解题思路
1)你的输入错了
原题只输入一个数 N,你却写成:
应改成只读一个 n:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2)你的函数意义错了
你原来的 A(n,m) 算的是排列型乘积,不是组合数。
应改成计算组合数:
这里的含义是:
C(a,b)=a(a−1)(a−2)⋯(a−b+1)1⋅2⋅3⋯bC(a,b)=\frac{a(a-1)(a-2)\cdots(a-b+1)}{1\cdot2\cdot3\cdots b} C(a,b)=1⋅2⋅3⋯ba(a−1)(a−2)⋯(a−b+1)
并且一旦发现结果已经大于 n,就提前返回,防止继续算下去没意义。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3)你的主逻辑完全不对
你原来直接输出:
但题目要求的是“第一次出现的位置”,不是某个值模 100003。
正确做法是:
* 若 n==1,答案就是 1
* 枚举 i=16...0
* 对每个 i,二分查找最大的行号范围里有没有 C(mid,i)=n
* 找到就输出位置
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4)为什么从 16 开始枚举
这是你给的解析里的核心:
> 起始元素为 C(k,2k),只需找到最小的 k 使得 C(k+1,2k+2) < Nmax,可知范围只需到 16。
因为题目 N ≤ 1e9,所以只需要检查到 16 即可,再大就不可能产生新的满足条件的第一次出现位置了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对你原代码的逐项修改指正
你的原代码:
应改成下面这些点:
修改 1:删除错误函数 A
因为它不是组合数,也不是这题要的内容。
修改 2:新增组合数函数 C
修改 3:输入改成只读一个 N
修改 4:特判 N==1
修改 5:增加枚举 + 二分
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最终代码
按你给的解析,改正后的完整代码如下:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
你原代码的本质错误总结
错误 1:题意理解错
你在算一个乘积,但题目要找的是“杨辉三角中第一次出现的位置”。
错误 2:输入格式错
题目只输入一个整数 N,你读了两个。
错误 3:函数含义错
你写的是排列/下降乘积,不是组合数。
错误 4:输出目标错
题目要求输出位置,不是输出某个值取模。